#function(idata,title,window,icon)


#import toolbox;

local obj=toolbox.new_toolbox(idata,title||_hT("Wizard#toolbox"),window,icon);

obj.b_no_close=false;
obj.showstep=false;

obj.labels=table();
obj.labels["Next"]=_kT("Next#wizard");
obj.labels["Finish"]=_kT("Finish#wizard");

// 页面总数量，外面没用
obj.page_count=0;


// 起始页
obj.fpage=nil;

// 页面调用栈，用于记录prev页面
obj.apage=[];


obj.pgmap=table();

// 向导完成时的处理函数
obj.on_done=function(model)
{
	model.end_modal(8);
	return true;
};

// 添加页面
obj.add_page=function(page,label)
{
	if(is_string(page))
	{
		page=this.new_page(page,label);
	}
	
	if(is_nil(this.fpage))
	{
		this.fpage=page;
	}	
	else
	{
		this.fpage.append(page);
	}
	return page;
};

// 创建一个页面
obj.new_page=function(name,label)
{
	local page=toolbox.new_operation(name,label);

	// 下一页面指针
	page.next=nil;

	// 点next时的处理代码，返回nil代码没有下一页了，抛出异常代表出错了
	page.on_next=function(model)
	{
		return this.next;
	};
	
	page.get_next_state=function(model)
	{
		if(!is_nil(this.next) || this.children!=nil)
		{
			return 1;
		}
		else
		{
			return 0;
		}
	};
	
	// 以next为下一页指针，把page添加到链表未尾
	page.append=function(page)
	{
		local p=this;
		while(!is_nil(p.next)) p=p.next;
		p.next=page;
	};
	
	// 切入这个page时的更新函数
	page.update=function(model)
	{

	};

	page.do_update=function(model,active,dir)
	{
	
	};

	
	page.do_evt_init=function(model)
	{
	};
	

	if(this.pgmap[page.name]!=nil)
	{
		throw "page:"..page.name.." already defined";
	}
	
	this.pgmap[page.name]=page;
	return page;
};

// 切换页面时刷新状态
obj.on_page=function(model,page,dir)
{

	local ec=model.evtmgr;

	model.data.op_index=page.index;
	model.transfer_data(+1);
	
	if(this.current_page)
	{
		this.current_page.do_update(model,-1,dir);
	}
	this.current_page=page;
	page.do_update(model,+1,dir);

	this.update_label("",model,page);

	return true;
};

obj.on_help=function(model,page)
{
	#import ui;
	
	local key= (page && page.helpkey) || this.helpkey;
	
	if(key)
	{
		ui.evt["Plugin.Help"].std_execute("search",key);
		return;
	}

	local uri= (page && page.helpuri) || this.helpuri;
	if(uri)
	{
		ui.evt["Plugin.Help"].std_execute("url",uri);
		return;
	}
	
	ui.evt["Plugin.Help"].std_execute("document");
}

obj.get_page=function(p)
{
	if(is_string(p))
	{
		p=this.pgmap[p];
	}
	return p;
};

obj.link_pages=function(p,...)
{
	p=this.get_page(p);
	if(p==nil)
	{
		return nil;
	}
	
	local q=p;
	
	for(v in [...])
	{
		v=this.get_page(v);
		
		if(v==nil)
		{
			break;
		}
		
		p.next=v;p=p.next;
	}
	p.next=nil;

	return q;
};

// 这个是用户自定义的事件初始化函数
obj.do_evt_init=function(model){};

// 事件初始化函数，一般使用默认的就可以了
obj.evt_init=function(model)
{
	
	local ec=model.evtmgr;
	
	this.basic_evt_init(model,this.pgmap);
	
	if(this.do_evt_init(model)===false)
	{
		return false;
	}

	ec.wm_var("op_index","op_index",this.fpage.index);	
	ec["op_index"].set("FLAG_HIDE_UI",1);

	local btn_next=ec.wm_cmd(_kT("Next#wizard"));
	local btn_prev=ec.wm_cmd(_kT("Prev#wizard"));
	local btn_help=ec.wm_cmd(_kT("Help#wizard"));
	

	// 上一页按扭的处理函数
	btn_prev.do_cmd_execute=function(param,model,evtmgr)
	{
		if(!model) return false;
		local context=model.context;
		
		if(context.apage.length()==0)
		{
			return true;
		}
		
		local page=context.apage[end];
		context.apage.pop();

		if(!context.on_page(model,page,-1))
		{
			logger.log_warning("on_prev error???");
		}

		return true;
	};
		
	// 下一页按扭的处理函数
	btn_next.do_cmd_execute=function(param,model,evtmgr)
	{
		if(!model) return false;
		local context=model.context;
		
		if(!model.transfer_data(-1))
		{
			logger.log_error(_hT("CANNOT_transfer_data_from_window#wizard"));
			return false;
		}
		
		local pageid=model.data.op_index;
		local page=context.pages[pageid];
		
		local nextpage;
		
		try
		{
			nextpage=page.on_next(model,context);
		}
		catch(e)
		{
			if(is_string(e))
			{
				#import ui;
				local msg_t=table();
				//msg_t.title = _hT("Error");
				msg_t.content = e;
				msg_t.type = "Error";
				ui.evt["Dialog.Msgs"].std_execute(msg_t,"Error");  
			}
			return false;
		}
		
		if(is_string(nextpage))
		{
			nextpage=model.context.pgmap[nextpage];
		}
		
		if(is_nil(nextpage))
		{
			return context.on_done(model);
		}
		
		
		context.apage[end+1]=page;
		if(!context.on_page(model,nextpage,+1))
		{
			logger.log_warning("on_next error???");
		}

		return true;
	};
	
	btn_help.do_cmd_execute=function(param,model,evtmgr)
	{
		if(!model) return false;
		local page=model.context.pages[model.evtmgr["op_index"].value];
		local context=model.context;
		context.on_help(model,page);
		return true;
	};
	
	btn_prev.set("FLAG_ENABLE",false);

	local on_op_selected=function(name,model)
	{
		local page=model.context.pages[model.evtmgr["op_index"].value];
		if(model.context.showstep)
		{
			model.std_execute("title",translate2(page.label));
		}
		
		if(name=="")
		{
			model.context.update_label(name,model,page);
		}

	};
	
	ec["sync_handler"].add(on_op_selected,"op_index");
	
};

obj.update_label=function(name,model,page)
{
	#import logger;
	
	if(page==nil)
	{
		page=model.context.pages[model.evtmgr["op_index"].value];
	}

	//logger.log_message("update label with name="..name);

	model.evtmgr["Prev#wizard"].set("FLAG_ENABLE",model.context.apage.length()>0);
	local next_state=page.get_next_state(model);
	model.evtmgr["Next#wizard"].set("LABEL",?(next_state&1==0,translate(model.context.labels["Finish"]),translate(model.context.labels["Next"])));
	model.evtmgr["Next#wizard"].set("FLAG_ENABLE",next_state&2==0);
};

obj.do_dlg_init=function()
{

};

obj.do_set_book=function(km)
{
	km.add_item("the_book");
};


// wizard的界面
obj.dlg_init=function(model)
{
	local km=model.maker;
	local ctx=model.context;
	
	local option=ctx.config.option;
	
	km.width(70).flags(km.IWND_WITHCOLON).align(km.ALIGN_RIGHT).sv(1);
	km.proportion(1).sv(2);
	km.flags(km.IWND_EXPAND).sv(3);
	
	if(this.do_dlg_init(model)===false)
	{
		return false;
	}
	
	km.win("bookbase"		,km.ld(3).book("book_hide").flags(km.IWND_PAGEONLY|km.IWND_EXPAND).proportion(1));					
		for_each(v in this.pages)
		{
			v.dlg_init(model,km);
		}
	km.end("the_book");
	
	local window_flags=km.IWND_AUTO_FIT;
	if(ctx.b_no_close)
	{
		window_flags|=km.IWND_NO_CLOSE;
	}
	
	km.win(ctx.window	,km.title(ctx.title)
					.flags(window_flags)
					.sprops("icon",ctx.icon)
					.nprops("min_width",option.min_width)
					.nprops("min_height",option.min_height)
					);
		km.win("row");	
			km.add("combo"			,km.width(240).book("book_hide").flags(km.IWND_READONLY|km.IWND_EXPAND).name("op_index"));
			this.do_set_book(km);
			km.add("hline",km.ld(3));
			km.win("col"			,km.ld(3));
				km.add("space",km.proportion(1));
				
				for(v in this.buttons)
				{
					if(is_array(v))
					{
						km.add("button", km.label(v[0]).sprops("menu",v[1]));					
					}
					else if(is_string(v))
					{
						km.add("button", km.width(100).name(v));
					}
				}
				
				if(this.buttons.length()>0)
				{
					km.add("space",km.width(20));
				}
				
				if(this.helpkey||this.helpuri)
				{
					km.add("button"		,km.width(100).name("Help#wizard"));
					km.add("space",km.width(20));
				}
				
				km.add("button"		,km.width(100).name("Prev#wizard"));
				km.add("button"		,km.width(100).name("Next#wizard"));
			
			km.end();

		km.end();
	km.end();
	
	this.current_page=this.fpage;
	this.fpage.do_update(model,1,0);
};
return obj;


